/**
 *
 *  Copyright (c) 2011,
 *  GaoTime
 *  All rights reserved.
 *
 *  @file       XmlTools.h
 *  @brief      xml解析工具
 *
 *  调用XmlTools_Encrypt进行xml的解析,解析返回XML_NODE指针,<br>
 *  返回的内容需要调用XmlTools_Free进行释放.<br>
 *  
 *  解析后的数据为树状结构.可以调用XmlTools_GetLeafNode,XmlTools_GetLeafNodeNext<br>
 *  等获需要数据<br>
 *  
 *  关联:<br>
 *  需要调用Tools.h中的Tools_Malloc,Tools_Free,ELFHash函数<br>
 *  
 *  @version    1.1
 *  @author     imuse
 *  @date       2011-06-16
 *  
 *  
 *  修订说明：最初版本  
 */
#ifndef XML_TOOL_H
#define XML_TOOL_H


#include "Tools.h"


///节点类型
enum XML_NODE_TYPE_tag
{
    ///标准结点
	XML_NODE_TYPE_NODE = 0,
    ///文本结点
	XML_NODE_TYPE_TEXT,
    ///xml标记
	XML_NODE_TYPE_XMLTAG,
    ///注释结点
	XML_NODE_TYPE_NOTE,
};

///属性节点
typedef struct XML_NODE_OPTION_tag
{
	u_int  hash;                            /**<hash，快速查找使用*/
	char *pName;                            /**<属性变量名*/
	char *pValue;                           /**<属性变量值*/
	struct XML_NODE_OPTION_tag *pNext;      /**<下一结点*/
}XML_NODE_OPTION;

///xml节点
typedef struct XML_NODE_tag
{

	u_byte		type;                       /**<结点类型*/
	u_int		hash;                       /**<结点标签hash，快速查找使用*/
	char		*pName;                     /**<结点名称*/
	XML_NODE_OPTION *pOption;               /**<属性头结点*/
	
	struct XML_NODE_tag	*pParentNode;       /**<父结点*/
	struct XML_NODE_tag	*pChildNode;        /**<子结点*/
	struct XML_NODE_tag	*pPrevNode;         /**<上一结点*/
	struct XML_NODE_tag	*pNextNode;         /**<下一结点*/
}XML_NODE;

/**解析xml模式字符为结点内容
 *
 *  @param char**	pStr	字符指针的指针
 *
 *  @return XML_NODE*	解析成功后的结点指针
 */
XML_NODE* XmlTools_Encrypt(char **pStart);

/**翻译结点及属性,其子结点
 *
 *  @param XML_NODE*		结点指针
 *
 *  @return -
 */
void XmlTools_Free(XML_NODE* pNode);


/**解析属性结点
 *
 *  @param char**	pStr	字符指针的指针
 *
 *  @return XML_NODE_OPTION*	属性结点指针
 */
XML_NODE_OPTION* XmlTools_EncryptOption(char **pStart);

/**根据tag获致XML中叶子结点
 *
 *  @param XML_NODE	*pNode		根结点指针
 *  @param char		*pLeaf		叶子结点tag
 *
 *  @return XML_NODE*	查找到的子结点指针
 */
XML_NODE *XmlTools_GetLeafNode(XML_NODE *pNode, char *pText);

/**获取当前结点的文本
 *
 *  @param XML_NODE	*pNode		当前结点指针
 *
 *  @return char*		结点文本内容
 */
char* XmlTools_GetLeafText(XML_NODE *pNode);

/**根据tag获致XML中叶子结点文本
 *
 *  @param XML_NODE	*pNode		当前结点指针
 *  @param char		*pLeaf		叶子结点tag
 *
 *  @return char*		结点文本内容
 */
char* XmlTools_GetLeafNodeText(XML_NODE *pNode, char *pText);

/**从当前结点查找的指定叶子tag的兄弟结点
 *
 *  @param XML_NODE*	pNode		当前结点
 *  @param char*		pText		兄弟结点叶子tag
 *
 *  @return XML_NODE*
 */
XML_NODE *XmlTools_GetLeafNodeNext(XML_NODE *pNode, char *pText);

/**获取属性变量值
 *
 *  @param XML_NODE_OPTION		*pOption		属性头结点
 *  @param char				*pText			变量名
 *
 *  @return char*		变量值
 */
char* XmlTools_GetOptionValue(XML_NODE_OPTION *pOption, char *pName);

/**根据tag获致当前结点的子结点
 *
 *  @param XML_NODE	*pNode		根结点指针
 *  @param char		*pLeaf		叶子结点tag
 *
 *  @return XML_NODE*	查找到的子结点指针
 */
XML_NODE *XmlTools_GetLeafNodeChild(XML_NODE *pNode, char *pText);

/**从字符串中根据tag获节点的内容
 *
 *  @param char *pXml           源字符串
 *  @param char		*pLeaf		节点tag
 *
 *  @return char *
 *  @note 调用该方法后需要主动释放返回指针
 */
char* XmlTools_GetLeaf(char *pXml, char *pLeaf);

#endif
